package com.hngy.scala

import org.apache.spark.{SparkConf, SparkContext}

/**
  * 需求：使用累加变量
  */
object AccumulatorOpScala {
  def main(args: Array[String]): Unit = {
    var conf = new SparkConf()
    conf.setAppName("AccumulatorOpScala")
      .setMaster("local")
    val sc = new SparkContext(conf)

    var dataRDD = sc.parallelize(Array(1,2,3,4,5))
    //这种写法是错误的，因为foreach代码是在worker节点上执行的
    // var total = 0和println("total:"+total)是在Driver进程中执行的
    //所以无法实现累加操作
    /*var total = 0
    dataRDD.foreach(num=>total += num)
    println("total:"+total)*/

    //定义累加变量
    val sumAccumnlator = sc.longAccumulator
    //2：使用累加变量
    dataRDD.foreach(num=>sumAccumnlator.add(num))
    //注意：只能在Driver进程中获取累加变量的结果
    println(sumAccumnlator.value)

    sc.stop()
  }

}
